package com.xf.day05

object PartialFunctionDemo {

  val isEven: PartialFunction[Int, String] ={
    case x if x % 2 == 0 => s"$x is even"
  }

  def main(args: Array[String]): Unit = {
     // 使用 isDefinedAt 方法 ( 判断数字是否在定义域内 )
    println(isEven.isDefinedAt(4))  // true
    println(isEven.isDefinedAt(3))  // false

    // 使用 applyOrElse 方法
     println(isEven.applyOrElse(4, ( _: Int) => "Not defined"))
     println(isEven.applyOrElse(3, ( _: Int) => "Not defined"))

    // 使用 orElse 组合两个偏函数
    val fallback:PartialFunction[Int, String] ={
      case _ => "Number not even"
    }

    val combinedFn = isEven.orElse(fallback)
    println(combinedFn(4))
    println(combinedFn(3))

    // 将此偏函数的结果传递给 另一个函数 k ,并生成新的函数
    val pf:PartialFunction[Int, String] = isEven.andThen( _.toUpperCase())

    // pf(4) 实际上是调用 pf.apply(4) ,如果传入的值不在偏函数的定义域内，就会报警; 调用 applyOrElse方法可以避免报错
    // val result = pf(4)
    val result = pf.applyOrElse(3, (_:Int) => "Not defined")
    println(result)
  }

}
